package trocabi.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import trocabi.TROCABI;
import trocabi.Renderer.BoldCellRenderer;
import trocabi.Renderer.ColorCellRenderer;
import trocabi.Renderer.DefaultCellRenderer;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import trocabi.Parameters;
import trocabi.Socle.JDateTextField;
import trocabi.Socle.SwingTools;
import trocabi.Socle.TechnicalException;
import static trocabi.TROCABI.ERREUR;
import static trocabi.TROCABI.fenetreExterne;
import trocabi.model.Article;
import trocabi.model.Article.Etat;
import trocabi.printer.OpenDocTools;
import trocabi.service.ArticleServices;

public class GuiInventaire extends JFrame implements ListSelectionListener, TableModelListener {
    private static final Logger           logger = Logger.getLogger("trocabi.view.GuiInventaire");
    private JTableModelInventaireArticles articlesModele;
    private ArticleServices               articlesService;
    private JTable                        jtableArticles;
    private JButton                       btValiderCodeBarre;
    private JButton                       btEtatDepot;
    private JButton                       btEtatRetrouve;
    private JButton                       btEtatVendu;
    private JButton                       btEtatBraderie;
    private JButton                       btImprimerCahier;
    private JDateTextField                dateCahier;
    private JPanel pContentPanel;
    private JLabel lTitre;
    private JPanel pCenter;
    private JPanel pRecherche;
    private JPanel pBoutons;
    private JScrollPane spListe;
  
   
    private JPanel pImpression;
    private JTextField tfCodeBarre;
 
    public GuiInventaire() {
        initComponents();
        articlesService=new ArticleServices();
    }

    private void initComponents() {
        this.setTitle("Inventaire");
        this.setSize(500, 500);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

        // Content panel de type BorderPanel --> nord = titre / centre = contenu / sud = licence, droits, auteurs ...
        pContentPanel = new JPanel(new BorderLayout());
        pContentPanel.setBackground(Color.white);
        this.setContentPane(pContentPanel);

        // Titre
        lTitre = new JLabel("<html><body><br/>Inventaire :<br/><br/></body></html>");
        lTitre.setHorizontalAlignment(SwingConstants.CENTER);
        pContentPanel.add(lTitre, BorderLayout.NORTH);

        /*
         * Que du gridBagLayout
         * ContentPanel de 4 lignes --> lignes 2 à 4 contiennent des panels (ligne 3 = scrollpanel / les autres = GridBagLayout)
         */
        pCenter = new JPanel(new GridBagLayout());
        GridBagConstraints tmp = new GridBagConstraints();
        // Sous-panel "Recherche"
        pRecherche = new JPanel(new GridBagLayout());
        tmp.gridx = 0;
        tmp.gridy = 0;
        tmp.insets = new Insets(10, 10, 0, 10);
        tmp.fill = GridBagConstraints.NONE;
        pRecherche.add(new JLabel("Saisie du code barre :"), tmp);
        tfCodeBarre = new JTextField();
        tfCodeBarre.setPreferredSize(new Dimension(150, 20));
        tmp.gridx = 1;
        pRecherche.add(tfCodeBarre, tmp);
        btValiderCodeBarre = new JButton("Valider");
        btValiderCodeBarre.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                chercherArticle(tfCodeBarre.getText());
            }
        });
        tmp.gridx = 2;
        tmp.weightx = 1;
        tmp.anchor = GridBagConstraints.LINE_START;
        pRecherche.add(btValiderCodeBarre, tmp);
        tmp.gridx = 0;
        tmp.gridy = 0;
        tmp.weightx = 0;
        tmp.insets = new Insets(0, 10, 0, 10);
        tmp.fill = GridBagConstraints.HORIZONTAL;
        pCenter.add(pRecherche, tmp);
        // Sous-panel "Boutons"
        pBoutons = new JPanel(new GridBagLayout());
        btEtatDepot = new JButton("En Dépôt");
        btEtatDepot.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                changerEtatArticle(Etat.DEPOT);
            }
        });
        tmp.gridx = 0;
        tmp.gridy = 0;
        tmp.insets = new Insets(10, 10, 0, 10);
        tmp.fill = GridBagConstraints.NONE;
        pBoutons.add(btEtatDepot, tmp);
        btEtatRetrouve = new JButton("Retrouvé");
        btEtatRetrouve.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                changerEtatArticle(Etat.RETROUVE);
            }
        });
        tmp.gridx = 1;
        pBoutons.add(btEtatRetrouve, tmp);
        btEtatVendu = new JButton("Vendu");
        btEtatVendu.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                changerEtatArticle(Etat.VENDU);
            }
        });
        tmp.gridx = 2;
        pBoutons.add(btEtatVendu, tmp);
        btEtatBraderie = new JButton("Braderie");
        btEtatBraderie.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                changerEtatArticle(Etat.BRADERIE);
            }
        });
        tmp.gridx = 3;
        tmp.weightx = 1;
        tmp.anchor = GridBagConstraints.LINE_START;
        pBoutons.add(btEtatBraderie, tmp);
        tmp.gridx = 0;
        tmp.gridy = 2;
        tmp.insets = new Insets(0, 10, 0, 10);
        tmp.fill = GridBagConstraints.BOTH;
        pCenter.add(pBoutons, tmp);
        // Sous-panel "Afficher Résultats Recherche"
        articlesModele = new JTableModelInventaireArticles(); 
        jtableArticles = new JTable(articlesModele);
        jtableArticles.getModel().addTableModelListener(this);
        
        int[] colSize = { 85, 110, 70, 170, 80, 80, 70, 70 };
        SwingTools.setJTableSize(jtableArticles, colSize);
        jtableArticles.setDefaultRenderer(Object.class, new DefaultCellRenderer());
        jtableArticles.getColumnModel().getColumn(0).setCellRenderer(new BoldCellRenderer());
        jtableArticles.getColumnModel().getColumn(7).setCellRenderer(new ColorCellRenderer());
        jtableArticles.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        jtableArticles.getSelectionModel().addListSelectionListener(this);
        TableRowSorter<TableModel> rsSorter = new <TableModel>TableRowSorter(jtableArticles.getModel());
        jtableArticles.setRowSorter(rsSorter);
        rsSorter.setSortsOnUpdates(true);
        spListe = new JScrollPane(jtableArticles);
        tmp.gridx = 0;
        tmp.gridy = 3;
        tmp.weightx = 0;
        tmp.weighty = 1;
        tmp.insets = new Insets(10, 10, 0, 10);
        pCenter.add(spListe, tmp);
        // Sous-panel "Impression"
        pImpression = new JPanel(new GridBagLayout());
        btImprimerCahier = new JButton("Imprimer cahier de vente");
        btImprimerCahier.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {	
                OpenDocTools odt=OpenDocTools.getInstance();
		odt.cahier_ventes(articlesModele.getArticles(),new java.sql.Date(dateCahier.getDate().getTime()), 1); // TODO: gerer idMagasin
            }
        });
        
        tmp.gridx = 0;
        tmp.gridy = 0;
        tmp.weighty = 0;
        tmp.fill = GridBagConstraints.NONE;
        tmp.anchor = GridBagConstraints.LINE_START;
        pImpression.add(btImprimerCahier, tmp);
        tmp.gridx = 1;
        pImpression.add(new JLabel("Date :"), tmp);
        try {
            dateCahier = new JDateTextField(Parameters.FORMAT_DATE); // date par defaut
        } catch (ParseException ex) {
            Logger.getLogger(GuiInventaire.class.getName()).log(Level.SEVERE, null, ex);
        }
        dateCahier.setColumns(10);
        dateCahier.setPreferredSize(new Dimension(100, 20));
        
        tmp.gridx = 2;
        tmp.weightx = 1;
        pImpression.add(dateCahier, tmp);
        tmp.gridx = 0;
        tmp.gridy = 4;
        tmp.insets = new Insets(10, 10, 10, 10);
        tmp.fill = GridBagConstraints.HORIZONTAL;
        pCenter.add(pImpression, tmp);
        pContentPanel.add(pCenter, BorderLayout.CENTER);
    }

    public void setDefault() {
        this.setLocationRelativeTo(null);
        tfCodeBarre.setText("");
        dateCahier.setText("");
        btEtatDepot.setEnabled(false);
        btEtatRetrouve.setEnabled(false);
        btEtatVendu.setEnabled(false);
        btEtatBraderie.setEnabled(false);
        btImprimerCahier.setEnabled(false);
        articlesModele.removeAll();
    }

    @Override
    public void valueChanged(ListSelectionEvent lse) {
        if (lse.getSource() == jtableArticles.getSelectionModel()) {
            if (jtableArticles.getSelectedRowCount() >= 1) {
                btEtatDepot.setEnabled(true);
                btEtatRetrouve.setEnabled(true);
                btEtatVendu.setEnabled(true);
                btEtatBraderie.setEnabled(true);
            } else {
                btEtatDepot.setEnabled(false);
                btEtatRetrouve.setEnabled(false);
                btEtatVendu.setEnabled(false);
                btEtatBraderie.setEnabled(false);
            }
        } else {
            TROCABI.fenetreExterne(TROCABI.ERREUR, "Erreur inattendue : source de l'évènement inconnue");
        }
    }

    @Override
    public void tableChanged(TableModelEvent tme) {
        if (tme.getSource() == jtableArticles.getModel()) {
            if (articlesModele.getRowCount() > 0) {
                btImprimerCahier.setEnabled(true);
            } else {
                btImprimerCahier.setEnabled(false);
            }
        } else {
            TROCABI.fenetreExterne(TROCABI.ERREUR, "Erreur inattendue : source de l'évènement inconnue");
        }
    }
  
     public void chercherArticle(String codeBarre) {
          // vérification champ "Code Barre"
         /*
         if (formatageIntPositif(CODE_BARRE, sCodeBarre) == -1) {
         fenetreExterne(ERREUR, "Le champ \"Code barre\" ne respecte pas le format de donnée attendu.\nCi-dessous le format attendu :\n     - Code Barre : ##########\n\nLes '#' correspondent à un chiffre (0 à 9)");
         return;
         }
         * */
        // Sélection en BDD par code barre
         ArrayList<Article> listArticles;
         try {
             listArticles = articlesService.chercherArticle(codeBarre);

             if (listArticles == null) {
                 fenetreExterne(ERREUR, "Aucun élément trouvé. Vérifiez votre code barre.");
                 return;
             }
             if (listArticles.size() != 1) {
                 fenetreExterne(ERREUR, "Erreur inattendue lors de la sélection de l'article.");
                 return;
             }
             articlesModele.add(listArticles.get(0));
         } catch (TechnicalException e) {
             Logger.getLogger(GuiInventaire.class.getName()).log(Level.SEVERE, null, e);
             TROCABI.fenetreExterne(TROCABI.ERREUR, e.getMessage());
         }
    }
     
    void changerEtatArticle(Etat etat) {
        int[] iSelectedRows = jtableArticles.getSelectedRows();
        try {
            for (int i = 0; i < iSelectedRows.length; i++) {
                Article article = articlesModele.getArticleAt(iSelectedRows[i]);
                articlesService.changeState(article, etat);
            }      
        } catch (TechnicalException e) {
            logger.severe(String.format("%s %s", e.getLocalizedMessage(), e.getMessage()));
            fenetreExterne(ERREUR, String.format("Erreur inattendue lors de la mise à jour de l'article %s",e.getMessage()));
        }
        articlesModele.refresh();
    }
}
